package indi.zyj.springsecurity.config;


import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //  开启请求权限管理
        http.authorizeRequests()
                .mvcMatchers("/login.html").permitAll()
                //  放行（必须在前面）
                .mvcMatchers("/test/index").permitAll()
                // 需要认证
                .mvcMatchers("/test/hello").authenticated()
                // 除了放行全认证
                .anyRequest().authenticated()
                .and()
                //  form表单认证
                .formLogin()
                //  指定登录页面
                .loginPage("/login.html")
                //  指定form表单用户名和密码
                .usernameParameter("username")
                .passwordParameter("password")
                //  指定请求url
                .loginProcessingUrl("/doLogin")
                //  认证成功后 forward跳转 强制跳转无论之前访问的那个接口
                //.successForwardUrl("/index")
                //  redirect跳转 如果之前访问指定接口
                //  那么它会跳转之前的 不会到这个里面
                //  除非设置为 true，默认是false
                //.defaultSuccessUrl("/index", false)
                .successHandler(new MyAuthenticationSuccessHandler())//前后端认证成功后
                //.failureUrl("/login.html")        // redirect跳转，默认 错误信息在session
                //.failureForwardUrl("/login.html") // foward跳转  错误信息在request中
                .failureHandler(new MyAuthenticationFailureHandler())//自定义认证失败后的请求

                .and()
                .logout()
                //.logoutUrl("/logout")               // 指定注销登录的url 默认get
                .logoutRequestMatcher(new OrRequestMatcher(     //指定特定的请求方式。or满足一个就ok
                        new AntPathRequestMatcher("/logout1", "GET"),
                        new AntPathRequestMatcher("/logout2", "POST")
                ))
                .clearAuthentication(true)          // 默认true 清除认证
                .invalidateHttpSession(true)        // 默认true 清除session
                //.logoutSuccessUrl("/login.html")    // 注销成功后跳转的页面
                .logoutSuccessHandler(new MyLogoutSuccessHandler())             // 注销成功后的请求，前后端分离

                .and()
                .csrf().disable();                   //  关闭csrf攻击
    }
}
